<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Voro++: c_loops.hh Source File</title>

<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />



</head>
<body>
<div id="top"><!-- do not remove this div! -->


<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  
  
  <td style="padding-left: 0.5em;">
   <div id="projectname">Voro++
   
   </div>
   
  </td>
  
  
  
 </tr>
 </tbody>
</table>
</div>

<!-- Generated by Doxygen 1.7.5.1 -->
<script type="text/javascript" src="dynsections.js"></script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>Globals</span></a></li>
    </ul>
  </div>
<div class="header">
  <div class="headertitle">
<div class="title">c_loops.hh</div>  </div>
</div>
<div class="contents">
<a href="c__loops_8hh.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// Voro++, a 3D cell-based Voronoi library</span>
<a name="l00002"></a>00002 <span class="comment">//</span>
<a name="l00003"></a>00003 <span class="comment">// Author   : Chris H. Rycroft (LBL / UC Berkeley)</span>
<a name="l00004"></a>00004 <span class="comment">// Email    : chr@alum.mit.edu</span>
<a name="l00005"></a>00005 <span class="comment">// Date     : August 30th 2011</span>
<a name="l00006"></a>00006 <span class="comment"></span>
<a name="l00007"></a>00007 <span class="comment">/** \file c_loops.hh</span>
<a name="l00008"></a>00008 <span class="comment"> * \brief Header file for the loop classes. */</span>
<a name="l00009"></a>00009 
<a name="l00010"></a>00010 <span class="preprocessor">#ifndef VOROPP_C_LOOPS_HH</span>
<a name="l00011"></a>00011 <span class="preprocessor"></span><span class="preprocessor">#define VOROPP_C_LOOPS_HH</span>
<a name="l00012"></a>00012 <span class="preprocessor"></span>
<a name="l00013"></a>00013 <span class="preprocessor">#include &lt;cstdio&gt;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include &lt;cstdlib&gt;</span>
<a name="l00015"></a>00015 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00016"></a>00016 <span class="preprocessor">#include &lt;vector&gt;</span>
<a name="l00017"></a>00017 <span class="keyword">using namespace </span>std;
<a name="l00018"></a>00018 
<a name="l00019"></a>00019 <span class="preprocessor">#include &quot;<a class="code" href="config_8hh.html" title="Master configuration file for setting various compile-time options.">config.hh</a>&quot;</span>
<a name="l00020"></a>00020 
<a name="l00021"></a>00021 <span class="keyword">namespace </span>voro {
<a name="l00022"></a>00022 <span class="comment"></span>
<a name="l00023"></a>00023 <span class="comment">/** A type associated with a c_loop_subset class, determining what type of</span>
<a name="l00024"></a>00024 <span class="comment"> * geometrical region to loop over. */</span>
<a name="l00025"></a>00025 <span class="keyword">enum</span> c_loop_subset_mode {
<a name="l00026"></a>00026         sphere,
<a name="l00027"></a>00027         box,
<a name="l00028"></a>00028         no_check
<a name="l00029"></a>00029 };
<a name="l00030"></a>00030 <span class="comment"></span>
<a name="l00031"></a>00031 <span class="comment">/** \brief A class for storing ordering information when particles are added to</span>
<a name="l00032"></a>00032 <span class="comment"> * a container.</span>
<a name="l00033"></a>00033 <span class="comment"> *</span>
<a name="l00034"></a>00034 <span class="comment"> * When particles are added to a container class, they are sorted into an</span>
<a name="l00035"></a>00035 <span class="comment"> * internal computational grid of blocks. The particle_order class provides a</span>
<a name="l00036"></a>00036 <span class="comment"> * mechanism for remembering which block particles were sorted into. The import</span>
<a name="l00037"></a>00037 <span class="comment"> * and put routines in the container class have variants that also take a</span>
<a name="l00038"></a>00038 <span class="comment"> * particle_order class. Each time they are called, they will store the block</span>
<a name="l00039"></a>00039 <span class="comment"> * that the particle was sorted into, plus the position of the particle within</span>
<a name="l00040"></a>00040 <span class="comment"> * the block. The particle_order class can used by the c_loop_order class to</span>
<a name="l00041"></a>00041 <span class="comment"> * specifically loop over the particles that have their information stored</span>
<a name="l00042"></a>00042 <span class="comment"> * within it. */</span>
<a name="l00043"></a><a class="code" href="classvoro_1_1particle__order.html">00043</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> {
<a name="l00044"></a>00044         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00045"></a>00045 <span class="comment">                /** A pointer to the array holding the ordering. */</span>
<a name="l00046"></a><a class="code" href="classvoro_1_1particle__order.html#af8bef46cbdfdee608090aa5df0666df2">00046</a>                 <span class="keywordtype">int</span> *<a class="code" href="classvoro_1_1particle__order.html#af8bef46cbdfdee608090aa5df0666df2">o</a>;<span class="comment"></span>
<a name="l00047"></a>00047 <span class="comment">                /** A pointer to the next position in the ordering array in</span>
<a name="l00048"></a>00048 <span class="comment">                 * which to store an entry. */</span>
<a name="l00049"></a><a class="code" href="classvoro_1_1particle__order.html#a6aeb89179930977f344416a0ba1c38a4">00049</a>                 <span class="keywordtype">int</span> *<a class="code" href="classvoro_1_1particle__order.html#a6aeb89179930977f344416a0ba1c38a4">op</a>;<span class="comment"></span>
<a name="l00050"></a>00050 <span class="comment">                /** The current memory allocation for the class, set to the</span>
<a name="l00051"></a>00051 <span class="comment">                 * number of entries which can be stored. */</span>
<a name="l00052"></a><a class="code" href="classvoro_1_1particle__order.html#a742bc941dfd87ecd64b42f6e50df19db">00052</a>                 <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1particle__order.html#a742bc941dfd87ecd64b42f6e50df19db">size</a>;<span class="comment"></span>
<a name="l00053"></a>00053 <span class="comment">                /** The particle_order constructor allocates memory to store the</span>
<a name="l00054"></a>00054 <span class="comment">                 * ordering information.</span>
<a name="l00055"></a>00055 <span class="comment">                 * \param[in] init_size the initial amount of memory to</span>
<a name="l00056"></a>00056 <span class="comment">                 *                      allocate. */</span>
<a name="l00057"></a><a class="code" href="classvoro_1_1particle__order.html#a205b5e4a472043123d091b1a3bc103c8">00057</a>                 <a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a>(<span class="keywordtype">int</span> init_size=init_ordering_size)
<a name="l00058"></a>00058                         : o(new int[init_size&lt;&lt;1]),op(o),size(init_size) {}<span class="comment"></span>
<a name="l00059"></a>00059 <span class="comment">                /** The particle_order destructor frees the dynamically allocated</span>
<a name="l00060"></a>00060 <span class="comment">                 * memory used to store the ordering information. */</span>
<a name="l00061"></a><a class="code" href="classvoro_1_1particle__order.html#aec68354015eedbde68752a58a8457c90">00061</a>                 <a class="code" href="classvoro_1_1particle__order.html#aec68354015eedbde68752a58a8457c90">~particle_order</a>() {
<a name="l00062"></a>00062                         <span class="keyword">delete</span> [] o;
<a name="l00063"></a>00063                 }<span class="comment"></span>
<a name="l00064"></a>00064 <span class="comment">                /** Adds a record to the order, corresponding to the memory</span>
<a name="l00065"></a>00065 <span class="comment">                 * address of where a particle was placed into the container.</span>
<a name="l00066"></a>00066 <span class="comment">                 * \param[in] ijk the block into which the particle was placed.</span>
<a name="l00067"></a>00067 <span class="comment">                 * \param[in] q the position within the block where the</span>
<a name="l00068"></a>00068 <span class="comment">                 *              particle was placed. */</span>
<a name="l00069"></a><a class="code" href="classvoro_1_1particle__order.html#adabcf6cd995eb03fe007844ba5637a8a">00069</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1particle__order.html#adabcf6cd995eb03fe007844ba5637a8a">add</a>(<span class="keywordtype">int</span> ijk,<span class="keywordtype">int</span> q) {
<a name="l00070"></a>00070                         <span class="keywordflow">if</span>(op==o+size) add_ordering_memory();
<a name="l00071"></a>00071                         *(op++)=ijk;*(op++)=q;
<a name="l00072"></a>00072                 }
<a name="l00073"></a>00073         <span class="keyword">private</span>:
<a name="l00074"></a>00074                 <span class="keywordtype">void</span> add_ordering_memory();
<a name="l00075"></a>00075 };
<a name="l00076"></a>00076 <span class="comment"></span>
<a name="l00077"></a>00077 <span class="comment">/** \brief Base class for looping over particles in a container.</span>
<a name="l00078"></a>00078 <span class="comment"> *</span>
<a name="l00079"></a>00079 <span class="comment"> * This class forms the base of all classes that can loop over a subset of</span>
<a name="l00080"></a>00080 <span class="comment"> * particles in a contaner in some order. When initialized, it stores constants</span>
<a name="l00081"></a>00081 <span class="comment"> * about the corresponding container geometry. It also contains a number of</span>
<a name="l00082"></a>00082 <span class="comment"> * routines for interrogating which particle currently being considered by the</span>
<a name="l00083"></a>00083 <span class="comment"> * loop, which are common between all of the derived classes. */</span>
<a name="l00084"></a><a class="code" href="classvoro_1_1c__loop__base.html">00084</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a> {
<a name="l00085"></a>00085         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00086"></a>00086 <span class="comment">                /** The number of blocks in the x direction. */</span>
<a name="l00087"></a><a class="code" href="classvoro_1_1c__loop__base.html#a0d6046f6de1f80849e5d1d8f3b7212e7">00087</a>                 <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#a0d6046f6de1f80849e5d1d8f3b7212e7">nx</a>;<span class="comment"></span>
<a name="l00088"></a>00088 <span class="comment">                /** The number of blocks in the y direction. */</span>
<a name="l00089"></a><a class="code" href="classvoro_1_1c__loop__base.html#ac8f42728e3a98149c2185aba833ac5ff">00089</a>                 <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#ac8f42728e3a98149c2185aba833ac5ff">ny</a>;<span class="comment"></span>
<a name="l00090"></a>00090 <span class="comment">                /** The number of blocks in the z direction. */</span>
<a name="l00091"></a><a class="code" href="classvoro_1_1c__loop__base.html#aaec35b971352bff60f4a446c430f26f8">00091</a>                 <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#aaec35b971352bff60f4a446c430f26f8">nz</a>;<span class="comment"></span>
<a name="l00092"></a>00092 <span class="comment">                /** A constant, set to the value of nx multiplied by ny, which</span>
<a name="l00093"></a>00093 <span class="comment">                 * is used in the routines that step through blocks in</span>
<a name="l00094"></a>00094 <span class="comment">                 * sequence. */</span>
<a name="l00095"></a><a class="code" href="classvoro_1_1c__loop__base.html#abb655606af4e184c2982f1a32cd47e12">00095</a>                 <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#abb655606af4e184c2982f1a32cd47e12">nxy</a>;<span class="comment"></span>
<a name="l00096"></a>00096 <span class="comment">                /** A constant, set to the value of nx*ny*nz, which is used in</span>
<a name="l00097"></a>00097 <span class="comment">                 * the routines that step through blocks in sequence. */</span>
<a name="l00098"></a><a class="code" href="classvoro_1_1c__loop__base.html#a68cafa132e9028ed7b143e93e85a102d">00098</a>                 <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#a68cafa132e9028ed7b143e93e85a102d">nxyz</a>;<span class="comment"></span>
<a name="l00099"></a>00099 <span class="comment">                /** The number of floating point numbers per particle in the</span>
<a name="l00100"></a>00100 <span class="comment">                 * associated container data structure. */</span>
<a name="l00101"></a><a class="code" href="classvoro_1_1c__loop__base.html#ab42c93bbaf7cfc11e3c95f5d38f694e2">00101</a>                 <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#ab42c93bbaf7cfc11e3c95f5d38f694e2">ps</a>;<span class="comment"></span>
<a name="l00102"></a>00102 <span class="comment">                /** A pointer to the particle position information in the</span>
<a name="l00103"></a>00103 <span class="comment">                 * associated container data structure. */</span>
<a name="l00104"></a><a class="code" href="classvoro_1_1c__loop__base.html#a2b6abbe65d550ae7071aaa28d0fbb534">00104</a>                 <span class="keywordtype">double</span> **<a class="code" href="classvoro_1_1c__loop__base.html#a2b6abbe65d550ae7071aaa28d0fbb534">p</a>;<span class="comment"></span>
<a name="l00105"></a>00105 <span class="comment">                /** A pointer to the particle ID information in the associated</span>
<a name="l00106"></a>00106 <span class="comment">                 * container data structure. */</span>
<a name="l00107"></a><a class="code" href="classvoro_1_1c__loop__base.html#ab64ac0420d5ebed7d3259dd5c861d5c1">00107</a>                 <span class="keywordtype">int</span> **<a class="code" href="classvoro_1_1c__loop__base.html#ab64ac0420d5ebed7d3259dd5c861d5c1">id</a>;<span class="comment"></span>
<a name="l00108"></a>00108 <span class="comment">                /** A pointer to the particle counts in the associated</span>
<a name="l00109"></a>00109 <span class="comment">                 * container data structure. */</span>
<a name="l00110"></a><a class="code" href="classvoro_1_1c__loop__base.html#a060e5b0e557141713b6897b0a0728f2d">00110</a>                 <span class="keywordtype">int</span> *<a class="code" href="classvoro_1_1c__loop__base.html#a060e5b0e557141713b6897b0a0728f2d">co</a>;<span class="comment"></span>
<a name="l00111"></a>00111 <span class="comment">                /** The current x-index of the block under consideration by the</span>
<a name="l00112"></a>00112 <span class="comment">                 * loop. */</span>
<a name="l00113"></a><a class="code" href="classvoro_1_1c__loop__base.html#aef465d2da85b963fa9e0e886ee273541">00113</a>                 <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#aef465d2da85b963fa9e0e886ee273541">i</a>;<span class="comment"></span>
<a name="l00114"></a>00114 <span class="comment">                /** The current y-index of the block under consideration by the</span>
<a name="l00115"></a>00115 <span class="comment">                 * loop. */</span>
<a name="l00116"></a><a class="code" href="classvoro_1_1c__loop__base.html#abbaba2fc0d1fa07760220d37a3cc7ccf">00116</a>                 <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#abbaba2fc0d1fa07760220d37a3cc7ccf">j</a>;<span class="comment"></span>
<a name="l00117"></a>00117 <span class="comment">                /** The current z-index of the block under consideration by the</span>
<a name="l00118"></a>00118 <span class="comment">                 * loop. */</span>
<a name="l00119"></a><a class="code" href="classvoro_1_1c__loop__base.html#abf2dcc131f23212c15169e90ba30d6e4">00119</a>                 <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#abf2dcc131f23212c15169e90ba30d6e4">k</a>;<span class="comment"></span>
<a name="l00120"></a>00120 <span class="comment">                /** The current index of the block under consideration by the</span>
<a name="l00121"></a>00121 <span class="comment">                 * loop. */</span>
<a name="l00122"></a><a class="code" href="classvoro_1_1c__loop__base.html#a3cb6bc5c8b22e57325bb136feba93d9b">00122</a>                 <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#a3cb6bc5c8b22e57325bb136feba93d9b">ijk</a>;<span class="comment"></span>
<a name="l00123"></a>00123 <span class="comment">                /** The index of the particle under consideration within the current</span>
<a name="l00124"></a>00124 <span class="comment">                 * block. */</span>
<a name="l00125"></a><a class="code" href="classvoro_1_1c__loop__base.html#a2eaa096a64736b5792cdf3d799b95786">00125</a>                 <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#a2eaa096a64736b5792cdf3d799b95786">q</a>;<span class="comment"></span>
<a name="l00126"></a>00126 <span class="comment">                /** The constructor copies several necessary constants from the</span>
<a name="l00127"></a>00127 <span class="comment">                 * base container class.</span>
<a name="l00128"></a>00128 <span class="comment">                 * \param[in] con the container class to use. */</span>
<a name="l00129"></a>00129                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_<span class="keyword">class</span>&gt;
<a name="l00130"></a><a class="code" href="classvoro_1_1c__loop__base.html#acc2351174b5d0a163b172fb016e94216">00130</a>                 <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a>(c_class &amp;con) : nx(con.nx), ny(con.ny), nz(con.nz),
<a name="l00131"></a>00131                                             nxy(con.nxy), nxyz(con.nxyz), ps(con.ps),
<a name="l00132"></a>00132                                             p(con.p), id(con.id), co(con.co) {}<span class="comment"></span>
<a name="l00133"></a>00133 <span class="comment">                /** Returns the position vector of the particle currently being</span>
<a name="l00134"></a>00134 <span class="comment">                 * considered by the loop.</span>
<a name="l00135"></a>00135 <span class="comment">                 * \param[out] (x,y,z) the position vector of the particle. */</span>
<a name="l00136"></a><a class="code" href="classvoro_1_1c__loop__base.html#ac9f65f527282809c894c7094291fca83">00136</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1c__loop__base.html#ac9f65f527282809c894c7094291fca83">pos</a>(<span class="keywordtype">double</span> &amp;x,<span class="keywordtype">double</span> &amp;y,<span class="keywordtype">double</span> &amp;z) {
<a name="l00137"></a>00137                         <span class="keywordtype">double</span> *pp=p[ijk]+ps*q;
<a name="l00138"></a>00138                         x=*(pp++);y=*(pp++);z=*pp;
<a name="l00139"></a>00139                 }<span class="comment"></span>
<a name="l00140"></a>00140 <span class="comment">                /** Returns the ID, position vector, and radius of the particle</span>
<a name="l00141"></a>00141 <span class="comment">                 * currently being considered by the loop.</span>
<a name="l00142"></a>00142 <span class="comment">                 * \param[out] pid the particle ID.</span>
<a name="l00143"></a>00143 <span class="comment">                 * \param[out] (x,y,z) the position vector of the particle.</span>
<a name="l00144"></a>00144 <span class="comment">                 * \param[out] r the radius of the particle. If no radius</span>
<a name="l00145"></a>00145 <span class="comment">                 *               information is available the default radius</span>
<a name="l00146"></a>00146 <span class="comment">                 *               value is returned. */</span>
<a name="l00147"></a><a class="code" href="classvoro_1_1c__loop__base.html#a33a5410ec11caa521d05c72e585bd155">00147</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1c__loop__base.html#a33a5410ec11caa521d05c72e585bd155">pos</a>(<span class="keywordtype">int</span> &amp;pid,<span class="keywordtype">double</span> &amp;x,<span class="keywordtype">double</span> &amp;y,<span class="keywordtype">double</span> &amp;z,<span class="keywordtype">double</span> &amp;r) {
<a name="l00148"></a>00148                         pid=<span class="keywordtype">id</span>[ijk][q];
<a name="l00149"></a>00149                         <span class="keywordtype">double</span> *pp=p[ijk]+ps*q;
<a name="l00150"></a>00150                         x=*(pp++);y=*(pp++);z=*pp;
<a name="l00151"></a>00151                         r=ps==3?default_radius:*(++pp);
<a name="l00152"></a>00152                 }<span class="comment"></span>
<a name="l00153"></a>00153 <span class="comment">                /** Returns the x position of the particle currently being</span>
<a name="l00154"></a>00154 <span class="comment">                 * considered by the loop. */</span>
<a name="l00155"></a><a class="code" href="classvoro_1_1c__loop__base.html#a759f4fc1cb4b7d5b41b1358c0e4fe4c3">00155</a>                 <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1c__loop__base.html#a759f4fc1cb4b7d5b41b1358c0e4fe4c3">x</a>() {<span class="keywordflow">return</span> p[ijk][ps*q];}<span class="comment"></span>
<a name="l00156"></a>00156 <span class="comment">                /** Returns the y position of the particle currently being</span>
<a name="l00157"></a>00157 <span class="comment">                 * considered by the loop. */</span>
<a name="l00158"></a><a class="code" href="classvoro_1_1c__loop__base.html#a2f4b84b1453d680afe11b7877f191758">00158</a>                 <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1c__loop__base.html#a2f4b84b1453d680afe11b7877f191758">y</a>() {<span class="keywordflow">return</span> p[ijk][ps*q+1];}<span class="comment"></span>
<a name="l00159"></a>00159 <span class="comment">                /** Returns the z position of the particle currently being</span>
<a name="l00160"></a>00160 <span class="comment">                 * considered by the loop. */</span>
<a name="l00161"></a><a class="code" href="classvoro_1_1c__loop__base.html#aec12d78b1e8282f84eac5a6fd67fc3c9">00161</a>                 <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1c__loop__base.html#aec12d78b1e8282f84eac5a6fd67fc3c9">z</a>() {<span class="keywordflow">return</span> p[ijk][ps*q+2];}<span class="comment"></span>
<a name="l00162"></a>00162 <span class="comment">                /** Returns the ID of the particle currently being considered</span>
<a name="l00163"></a>00163 <span class="comment">                 * by the loop. */</span>
<a name="l00164"></a><a class="code" href="classvoro_1_1c__loop__base.html#aa958fedbef8948a8a359ce00bdb52d07">00164</a>                 <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1c__loop__base.html#aa958fedbef8948a8a359ce00bdb52d07">pid</a>() {<span class="keywordflow">return</span> <span class="keywordtype">id</span>[ijk][q];}
<a name="l00165"></a>00165 };
<a name="l00166"></a>00166 <span class="comment"></span>
<a name="l00167"></a>00167 <span class="comment">/** \brief Class for looping over all of the particles in a container.</span>
<a name="l00168"></a>00168 <span class="comment"> *</span>
<a name="l00169"></a>00169 <span class="comment"> * This is one of the simplest loop classes, that scans the computational</span>
<a name="l00170"></a>00170 <span class="comment"> * blocks in order, and scans all the particles within each block in order. */</span>
<a name="l00171"></a><a class="code" href="classvoro_1_1c__loop__all.html">00171</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1c__loop__all.html" title="Class for looping over all of the particles in a container.">c_loop_all</a> : <span class="keyword">public</span> <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a> {
<a name="l00172"></a>00172         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00173"></a>00173 <span class="comment">                /** The constructor copies several necessary constants from the</span>
<a name="l00174"></a>00174 <span class="comment">                 * base container class.</span>
<a name="l00175"></a>00175 <span class="comment">                 * \param[in] con the container class to use. */</span>
<a name="l00176"></a>00176                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_<span class="keyword">class</span>&gt;
<a name="l00177"></a><a class="code" href="classvoro_1_1c__loop__all.html#a255049d5c5f878a24804ed2e29043e68">00177</a>                 <a class="code" href="classvoro_1_1c__loop__all.html#a255049d5c5f878a24804ed2e29043e68">c_loop_all</a>(c_class &amp;con) : <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a>(con) {}<span class="comment"></span>
<a name="l00178"></a>00178 <span class="comment">                /** Sets the class to consider the first particle.</span>
<a name="l00179"></a>00179 <span class="comment">                 * \return True if there is any particle to consider, false</span>
<a name="l00180"></a>00180 <span class="comment">                 * otherwise. */</span>
<a name="l00181"></a><a class="code" href="classvoro_1_1c__loop__all.html#acab7b0f3917a172844d4d2565913855d">00181</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1c__loop__all.html#acab7b0f3917a172844d4d2565913855d">start</a>() {
<a name="l00182"></a>00182                         i=j=k=ijk=q=0;
<a name="l00183"></a>00183                         <span class="keywordflow">while</span>(co[ijk]==0) <span class="keywordflow">if</span>(!next_block()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00184"></a>00184                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00185"></a>00185                 }<span class="comment"></span>
<a name="l00186"></a>00186 <span class="comment">                /** Finds the next particle to test.</span>
<a name="l00187"></a>00187 <span class="comment">                 * \return True if there is another particle, false if no more</span>
<a name="l00188"></a>00188 <span class="comment">                 * particles are available. */</span>
<a name="l00189"></a><a class="code" href="classvoro_1_1c__loop__all.html#a322b26b0f78f73b345ee0af92f908df0">00189</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1c__loop__all.html#a322b26b0f78f73b345ee0af92f908df0">inc</a>() {
<a name="l00190"></a>00190                         q++;
<a name="l00191"></a>00191                         <span class="keywordflow">if</span>(q&gt;=co[ijk]) {
<a name="l00192"></a>00192                                 q=0;
<a name="l00193"></a>00193                                 <span class="keywordflow">do</span> {
<a name="l00194"></a>00194                                         <span class="keywordflow">if</span>(!next_block()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00195"></a>00195                                 } <span class="keywordflow">while</span>(co[ijk]==0);
<a name="l00196"></a>00196                         }
<a name="l00197"></a>00197                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00198"></a>00198                 }
<a name="l00199"></a>00199         <span class="keyword">private</span>:<span class="comment"></span>
<a name="l00200"></a>00200 <span class="comment">                /** Updates the internal variables to find the next</span>
<a name="l00201"></a>00201 <span class="comment">                 * computational block with any particles.</span>
<a name="l00202"></a>00202 <span class="comment">                 * \return True if another block is found, false if there are</span>
<a name="l00203"></a>00203 <span class="comment">                 * no more blocks. */</span>
<a name="l00204"></a>00204                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> next_block() {
<a name="l00205"></a>00205                         ijk++;
<a name="l00206"></a>00206                         i++;
<a name="l00207"></a>00207                         <span class="keywordflow">if</span>(i==nx) {
<a name="l00208"></a>00208                                 i=0;j++;
<a name="l00209"></a>00209                                 <span class="keywordflow">if</span>(j==ny) {
<a name="l00210"></a>00210                                         j=0;k++;
<a name="l00211"></a>00211                                         <span class="keywordflow">if</span>(ijk==nxyz) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00212"></a>00212                                 }
<a name="l00213"></a>00213                         }
<a name="l00214"></a>00214                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00215"></a>00215                 }
<a name="l00216"></a>00216 };
<a name="l00217"></a>00217 <span class="comment"></span>
<a name="l00218"></a>00218 <span class="comment">/** \brief Class for looping over a subset of particles in a container.</span>
<a name="l00219"></a>00219 <span class="comment"> *</span>
<a name="l00220"></a>00220 <span class="comment"> * This class can loop over a subset of particles in a certain geometrical</span>
<a name="l00221"></a>00221 <span class="comment"> * region within the container. The class can be set up to loop over a</span>
<a name="l00222"></a>00222 <span class="comment"> * rectangular box or sphere. It can also rectangular group of internal</span>
<a name="l00223"></a>00223 <span class="comment"> * computational blocks. */</span>
<a name="l00224"></a><a class="code" href="classvoro_1_1c__loop__subset.html">00224</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1c__loop__subset.html" title="Class for looping over a subset of particles in a container.">c_loop_subset</a> : <span class="keyword">public</span> <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a> {
<a name="l00225"></a>00225         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00226"></a>00226 <span class="comment">                /** The current mode of operation, determining whether tests</span>
<a name="l00227"></a>00227 <span class="comment">                 * should be applied to particles to ensure they are within a</span>
<a name="l00228"></a>00228 <span class="comment">                 * certain geometrical object. */</span>
<a name="l00229"></a><a class="code" href="classvoro_1_1c__loop__subset.html#ac5d8b2aa34f936022e9059ca093b914c">00229</a>                 c_loop_subset_mode <a class="code" href="classvoro_1_1c__loop__subset.html#ac5d8b2aa34f936022e9059ca093b914c">mode</a>;<span class="comment"></span>
<a name="l00230"></a>00230 <span class="comment">                /** The constructor copies several necessary constants from the</span>
<a name="l00231"></a>00231 <span class="comment">                 * base container class.</span>
<a name="l00232"></a>00232 <span class="comment">                 * \param[in] con the container class to use. */</span>
<a name="l00233"></a>00233                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_<span class="keyword">class</span>&gt;
<a name="l00234"></a><a class="code" href="classvoro_1_1c__loop__subset.html#aab236b412de99f7a58d77d23a25ff44f">00234</a>                 <a class="code" href="classvoro_1_1c__loop__subset.html" title="Class for looping over a subset of particles in a container.">c_loop_subset</a>(c_class &amp;con) : <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a>(con), ax(con.ax), ay(con.ay), az(con.az),
<a name="l00235"></a>00235                         sx(con.bx-ax), sy(con.by-ay), sz(con.bz-az), xsp(con.xsp), ysp(con.ysp), zsp(con.zsp),
<a name="l00236"></a>00236                         xperiodic(con.xperiodic), yperiodic(con.yperiodic), zperiodic(con.zperiodic) {}
<a name="l00237"></a>00237                 <span class="keywordtype">void</span> setup_sphere(<span class="keywordtype">double</span> vx,<span class="keywordtype">double</span> vy,<span class="keywordtype">double</span> vz,<span class="keywordtype">double</span> r,<span class="keywordtype">bool</span> bounds_test=<span class="keyword">true</span>);
<a name="l00238"></a>00238                 <span class="keywordtype">void</span> setup_box(<span class="keywordtype">double</span> xmin,<span class="keywordtype">double</span> xmax,<span class="keywordtype">double</span> ymin,<span class="keywordtype">double</span> ymax,<span class="keywordtype">double</span> zmin,<span class="keywordtype">double</span> zmax,<span class="keywordtype">bool</span> bounds_test=<span class="keyword">true</span>);
<a name="l00239"></a>00239                 <span class="keywordtype">void</span> setup_intbox(<span class="keywordtype">int</span> ai_,<span class="keywordtype">int</span> bi_,<span class="keywordtype">int</span> aj_,<span class="keywordtype">int</span> bj_,<span class="keywordtype">int</span> ak_,<span class="keywordtype">int</span> bk_);
<a name="l00240"></a>00240                 <span class="keywordtype">bool</span> start();<span class="comment"></span>
<a name="l00241"></a>00241 <span class="comment">                /** Finds the next particle to test.</span>
<a name="l00242"></a>00242 <span class="comment">                 * \return True if there is another particle, false if no more</span>
<a name="l00243"></a>00243 <span class="comment">                 * particles are available. */</span>
<a name="l00244"></a><a class="code" href="classvoro_1_1c__loop__subset.html#af45a6a610d039dc8c8434caf61b092c6">00244</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1c__loop__subset.html#af45a6a610d039dc8c8434caf61b092c6">inc</a>() {
<a name="l00245"></a>00245                         <span class="keywordflow">do</span> {
<a name="l00246"></a>00246                                 q++;
<a name="l00247"></a>00247                                 <span class="keywordflow">while</span>(q&gt;=co[ijk]) {q=0;<span class="keywordflow">if</span>(!next_block()) <span class="keywordflow">return</span> <span class="keyword">false</span>;}
<a name="l00248"></a>00248                         } <span class="keywordflow">while</span>(mode!=no_check&amp;&amp;out_of_bounds());
<a name="l00249"></a>00249                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00250"></a>00250                 }
<a name="l00251"></a>00251         <span class="keyword">private</span>:
<a name="l00252"></a>00252                 <span class="keyword">const</span> <span class="keywordtype">double</span> ax,ay,az,sx,sy,sz,xsp,ysp,zsp;
<a name="l00253"></a>00253                 <span class="keyword">const</span> <span class="keywordtype">bool</span> xperiodic,yperiodic,zperiodic;
<a name="l00254"></a>00254                 <span class="keywordtype">double</span> px,py,pz,apx,apy,apz;
<a name="l00255"></a>00255                 <span class="keywordtype">double</span> v0,v1,v2,v3,v4,v5;
<a name="l00256"></a>00256                 <span class="keywordtype">int</span> ai,bi,aj,bj,ak,bk,s;
<a name="l00257"></a>00257                 <span class="keywordtype">int</span> ci,cj,ck,di,dj,dk,inc1,inc2;
<a name="l00258"></a>00258                 <span class="keyword">inline</span> <span class="keywordtype">int</span> step_mod(<span class="keywordtype">int</span> a,<span class="keywordtype">int</span> b) {<span class="keywordflow">return</span> a&gt;=0?a%b:b-1-(b-1-a)%b;}
<a name="l00259"></a>00259                 <span class="keyword">inline</span> <span class="keywordtype">int</span> step_div(<span class="keywordtype">int</span> a,<span class="keywordtype">int</span> b) {<span class="keywordflow">return</span> a&gt;=0?a/b:-1+(a+1)/b;}
<a name="l00260"></a>00260                 <span class="keyword">inline</span> <span class="keywordtype">int</span> step_int(<span class="keywordtype">double</span> a) {<span class="keywordflow">return</span> a&lt;0?int(a)-1:int(a);}
<a name="l00261"></a>00261                 <span class="keywordtype">void</span> setup_common();
<a name="l00262"></a>00262                 <span class="keywordtype">bool</span> next_block();
<a name="l00263"></a>00263                 <span class="keywordtype">bool</span> out_of_bounds();
<a name="l00264"></a>00264 };
<a name="l00265"></a>00265 <span class="comment"></span>
<a name="l00266"></a>00266 <span class="comment">/** \brief Class for looping over all of the particles specified in a</span>
<a name="l00267"></a>00267 <span class="comment"> * pre-assembled particle_order class.</span>
<a name="l00268"></a>00268 <span class="comment"> *</span>
<a name="l00269"></a>00269 <span class="comment"> * The particle_order class can be used to create a specific order of particles</span>
<a name="l00270"></a>00270 <span class="comment"> * within the container. This class can then loop over these particles in this</span>
<a name="l00271"></a>00271 <span class="comment"> * order. The class is particularly useful in cases where the ordering of the</span>
<a name="l00272"></a>00272 <span class="comment"> * output must match the ordering of particles as they were inserted into the</span>
<a name="l00273"></a>00273 <span class="comment"> * container. */</span>
<a name="l00274"></a><a class="code" href="classvoro_1_1c__loop__order.html">00274</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1c__loop__order.html" title="Class for looping over all of the particles specified in a pre-assembled particle_order class...">c_loop_order</a> : <span class="keyword">public</span> <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a> {
<a name="l00275"></a>00275         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00276"></a>00276 <span class="comment">                /** A reference to the ordering class to use. */</span>
<a name="l00277"></a><a class="code" href="classvoro_1_1c__loop__order.html#a3a9be1df3e0f88e0e3e6fc0458949987">00277</a>                 <a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> &amp;<a class="code" href="classvoro_1_1c__loop__order.html#a3a9be1df3e0f88e0e3e6fc0458949987">vo</a>;<span class="comment"></span>
<a name="l00278"></a>00278 <span class="comment">                /** A pointer to the current position in the ordering class. */</span>
<a name="l00279"></a><a class="code" href="classvoro_1_1c__loop__order.html#a9b82e0a6ce7c6ed0456738cf23e08c61">00279</a>                 <span class="keywordtype">int</span> *<a class="code" href="classvoro_1_1c__loop__order.html#a9b82e0a6ce7c6ed0456738cf23e08c61">cp</a>;<span class="comment"></span>
<a name="l00280"></a>00280 <span class="comment">                /** A pointer to the end position in the ordering class. */</span>
<a name="l00281"></a><a class="code" href="classvoro_1_1c__loop__order.html#a6c2b7ac4d078f84490b9433523bf766f">00281</a>                 <span class="keywordtype">int</span> *<a class="code" href="classvoro_1_1c__loop__order.html#a6c2b7ac4d078f84490b9433523bf766f">op</a>;<span class="comment"></span>
<a name="l00282"></a>00282 <span class="comment">                /** The constructor copies several necessary constants from the</span>
<a name="l00283"></a>00283 <span class="comment">                 * base class, and sets up a reference to the ordering class to</span>
<a name="l00284"></a>00284 <span class="comment">                 * use.</span>
<a name="l00285"></a>00285 <span class="comment">                 * \param[in] con the container class to use.</span>
<a name="l00286"></a>00286 <span class="comment">                 * \param[in] vo_ the ordering class to use. */</span>
<a name="l00287"></a>00287                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_<span class="keyword">class</span>&gt;
<a name="l00288"></a><a class="code" href="classvoro_1_1c__loop__order.html#a08bc288a867bff0716d67fde7f18b892">00288</a>                 <a class="code" href="classvoro_1_1c__loop__order.html" title="Class for looping over all of the particles specified in a pre-assembled particle_order class...">c_loop_order</a>(c_class &amp;con,<a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> &amp;vo_)
<a name="l00289"></a>00289                 : <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a>(con), vo(vo_), nx(con.nx), nxy(con.nxy) {}<span class="comment"></span>
<a name="l00290"></a>00290 <span class="comment">                /** Sets the class to consider the first particle.</span>
<a name="l00291"></a>00291 <span class="comment">                 * \return True if there is any particle to consider, false</span>
<a name="l00292"></a>00292 <span class="comment">                 * otherwise. */</span>
<a name="l00293"></a><a class="code" href="classvoro_1_1c__loop__order.html#a0e03892771119212847d1ea7c56c5228">00293</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1c__loop__order.html#a0e03892771119212847d1ea7c56c5228">start</a>() {
<a name="l00294"></a>00294                         cp=vo.o;op=vo.op;
<a name="l00295"></a>00295                         <span class="keywordflow">if</span>(cp!=op) {
<a name="l00296"></a>00296                                 ijk=*(cp++);decode();
<a name="l00297"></a>00297                                 q=*(cp++);
<a name="l00298"></a>00298                                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00299"></a>00299                         } <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00300"></a>00300                 }<span class="comment"></span>
<a name="l00301"></a>00301 <span class="comment">                /** Finds the next particle to test.</span>
<a name="l00302"></a>00302 <span class="comment">                 * \return True if there is another particle, false if no more</span>
<a name="l00303"></a>00303 <span class="comment">                 * particles are available. */</span>
<a name="l00304"></a><a class="code" href="classvoro_1_1c__loop__order.html#ae2e1c198611110487e9b41c17cae65a7">00304</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1c__loop__order.html#ae2e1c198611110487e9b41c17cae65a7">inc</a>() {
<a name="l00305"></a>00305                         <span class="keywordflow">if</span>(cp==op) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00306"></a>00306                         ijk=*(cp++);decode();
<a name="l00307"></a>00307                         q=*(cp++);
<a name="l00308"></a>00308                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00309"></a>00309                 }
<a name="l00310"></a>00310         <span class="keyword">private</span>:<span class="comment"></span>
<a name="l00311"></a>00311 <span class="comment">                /** The number of computational blocks in the x direction. */</span>
<a name="l00312"></a>00312                 <span class="keyword">const</span> <span class="keywordtype">int</span> nx;<span class="comment"></span>
<a name="l00313"></a>00313 <span class="comment">                /** The number of computational blocks in a z-slice. */</span>
<a name="l00314"></a>00314                 <span class="keyword">const</span> <span class="keywordtype">int</span> nxy;<span class="comment"></span>
<a name="l00315"></a>00315 <span class="comment">                /** Takes the current block index and computes indices in the</span>
<a name="l00316"></a>00316 <span class="comment">                 * x, y, and z directions. */</span>
<a name="l00317"></a>00317                 <span class="keyword">inline</span> <span class="keywordtype">void</span> decode() {
<a name="l00318"></a>00318                         k=ijk/nxy;
<a name="l00319"></a>00319                         <span class="keywordtype">int</span> ijkt=ijk-nxy*k;
<a name="l00320"></a>00320                         j=ijkt/nx;
<a name="l00321"></a>00321                         i=ijkt-j*nx;
<a name="l00322"></a>00322                 }
<a name="l00323"></a>00323 };
<a name="l00324"></a>00324 <span class="comment"></span>
<a name="l00325"></a>00325 <span class="comment">/** \brief A class for looping over all particles in a container_periodic or</span>
<a name="l00326"></a>00326 <span class="comment"> * container_periodic_poly class.</span>
<a name="l00327"></a>00327 <span class="comment"> *</span>
<a name="l00328"></a>00328 <span class="comment"> * Since the container_periodic and container_periodic_poly classes have a</span>
<a name="l00329"></a>00329 <span class="comment"> * fundamentally different memory organization, the regular loop classes cannot</span>
<a name="l00330"></a>00330 <span class="comment"> * be used with them. */</span>
<a name="l00331"></a><a class="code" href="classvoro_1_1c__loop__all__periodic.html">00331</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1c__loop__all__periodic.html" title="A class for looping over all particles in a container_periodic or container_periodic_poly class...">c_loop_all_periodic</a> : <span class="keyword">public</span> <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a> {
<a name="l00332"></a>00332         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00333"></a>00333 <span class="comment">                /** The constructor copies several necessary constants from the</span>
<a name="l00334"></a>00334 <span class="comment">                 * base periodic container class.</span>
<a name="l00335"></a>00335 <span class="comment">                 * \param[in] con the periodic container class to use. */</span>
<a name="l00336"></a>00336                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_<span class="keyword">class</span>&gt;
<a name="l00337"></a><a class="code" href="classvoro_1_1c__loop__all__periodic.html#a07dc6f74c7a503bb8cb4e7fa4f2e84ff">00337</a>                 <a class="code" href="classvoro_1_1c__loop__all__periodic.html" title="A class for looping over all particles in a container_periodic or container_periodic_poly class...">c_loop_all_periodic</a>(c_class &amp;con) : <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a>(con), ey(con.ey), ez(con.ez), wy(con.wy), wz(con.wz),
<a name="l00338"></a>00338                         ijk0(nx*(ey+con.oy*ez)), inc2(2*nx*con.ey+1) {}<span class="comment"></span>
<a name="l00339"></a>00339 <span class="comment">                /** Sets the class to consider the first particle.</span>
<a name="l00340"></a>00340 <span class="comment">                 * \return True if there is any particle to consider, false</span>
<a name="l00341"></a>00341 <span class="comment">                 * otherwise. */</span>
<a name="l00342"></a><a class="code" href="classvoro_1_1c__loop__all__periodic.html#ab7b002f40adfe7116d3db77d6bb95f4c">00342</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1c__loop__all__periodic.html#ab7b002f40adfe7116d3db77d6bb95f4c">start</a>() {
<a name="l00343"></a>00343                         i=0;
<a name="l00344"></a>00344                         j=ey;
<a name="l00345"></a>00345                         k=ez;
<a name="l00346"></a>00346                         ijk=ijk0;
<a name="l00347"></a>00347                         q=0;
<a name="l00348"></a>00348                         <span class="keywordflow">while</span>(co[ijk]==0) <span class="keywordflow">if</span>(!next_block()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00349"></a>00349                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00350"></a>00350                 }<span class="comment"></span>
<a name="l00351"></a>00351 <span class="comment">                /** Finds the next particle to test.</span>
<a name="l00352"></a>00352 <span class="comment">                 * \return True if there is another particle, false if no more</span>
<a name="l00353"></a>00353 <span class="comment">                 * particles are available. */</span>
<a name="l00354"></a><a class="code" href="classvoro_1_1c__loop__all__periodic.html#ac25d006faa31cee1d1b6bbc621532651">00354</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1c__loop__all__periodic.html#ac25d006faa31cee1d1b6bbc621532651">inc</a>() {
<a name="l00355"></a>00355                         q++;
<a name="l00356"></a>00356                         <span class="keywordflow">if</span>(q&gt;=co[ijk]) {
<a name="l00357"></a>00357                                 q=0;
<a name="l00358"></a>00358                                 <span class="keywordflow">do</span> {
<a name="l00359"></a>00359                                         <span class="keywordflow">if</span>(!next_block()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00360"></a>00360                                 } <span class="keywordflow">while</span>(co[ijk]==0);
<a name="l00361"></a>00361                         }
<a name="l00362"></a>00362                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00363"></a>00363                 }
<a name="l00364"></a>00364         <span class="keyword">private</span>:<span class="comment"></span>
<a name="l00365"></a>00365 <span class="comment">                /** The lower y index (inclusive) of the primary domain within</span>
<a name="l00366"></a>00366 <span class="comment">                 * the block structure. */</span>
<a name="l00367"></a>00367                 <span class="keywordtype">int</span> ey;<span class="comment"></span>
<a name="l00368"></a>00368 <span class="comment">                /** The lower y index (inclusive) of the primary domain within</span>
<a name="l00369"></a>00369 <span class="comment">                 * the block structure. */</span>
<a name="l00370"></a>00370                 <span class="keywordtype">int</span> ez;<span class="comment"></span>
<a name="l00371"></a>00371 <span class="comment">                /** The upper y index (exclusive) of the primary domain within</span>
<a name="l00372"></a>00372 <span class="comment">                 * the block structure. */</span>
<a name="l00373"></a>00373                 <span class="keywordtype">int</span> wy;<span class="comment"></span>
<a name="l00374"></a>00374 <span class="comment">                /** The upper z index (exclusive) of the primary domain within</span>
<a name="l00375"></a>00375 <span class="comment">                 * the block structure. */</span>
<a name="l00376"></a>00376                 <span class="keywordtype">int</span> wz;<span class="comment"></span>
<a name="l00377"></a>00377 <span class="comment">                /** The index of the (0,0,0) block within the block structure.</span>
<a name="l00378"></a>00378 <span class="comment">                 */</span>
<a name="l00379"></a>00379                 <span class="keywordtype">int</span> ijk0;<span class="comment"></span>
<a name="l00380"></a>00380 <span class="comment">                /** A value to increase ijk by when the z index is increased.</span>
<a name="l00381"></a>00381 <span class="comment">                 */</span>
<a name="l00382"></a>00382                 <span class="keywordtype">int</span> inc2;<span class="comment"></span>
<a name="l00383"></a>00383 <span class="comment">                /** Updates the internal variables to find the next</span>
<a name="l00384"></a>00384 <span class="comment">                 * computational block with any particles.</span>
<a name="l00385"></a>00385 <span class="comment">                 * \return True if another block is found, false if there are</span>
<a name="l00386"></a>00386 <span class="comment">                 * no more blocks. */</span>
<a name="l00387"></a>00387                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> next_block() {
<a name="l00388"></a>00388                         i++;
<a name="l00389"></a>00389                         <span class="keywordflow">if</span>(i==nx) {
<a name="l00390"></a>00390                                 i=0;j++;
<a name="l00391"></a>00391                                 <span class="keywordflow">if</span>(j==wy) {
<a name="l00392"></a>00392                                         j=ey;k++;
<a name="l00393"></a>00393                                         <span class="keywordflow">if</span>(k==wz) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00394"></a>00394                                         ijk+=inc2;
<a name="l00395"></a>00395                                 } <span class="keywordflow">else</span> ijk++;
<a name="l00396"></a>00396                         } <span class="keywordflow">else</span> ijk++;
<a name="l00397"></a>00397                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00398"></a>00398                 }
<a name="l00399"></a>00399 };
<a name="l00400"></a>00400 <span class="comment"></span>
<a name="l00401"></a>00401 <span class="comment">/** \brief Class for looping over all of the particles specified in a</span>
<a name="l00402"></a>00402 <span class="comment"> * pre-assembled particle_order class, for use with container_periodic classes.</span>
<a name="l00403"></a>00403 <span class="comment"> *</span>
<a name="l00404"></a>00404 <span class="comment"> * The particle_order class can be used to create a specific order of particles</span>
<a name="l00405"></a>00405 <span class="comment"> * within the container. This class can then loop over these particles in this</span>
<a name="l00406"></a>00406 <span class="comment"> * order. The class is particularly useful in cases where the ordering of the</span>
<a name="l00407"></a>00407 <span class="comment"> * output must match the ordering of particles as they were inserted into the</span>
<a name="l00408"></a>00408 <span class="comment"> * container. */</span>
<a name="l00409"></a><a class="code" href="classvoro_1_1c__loop__order__periodic.html">00409</a> <span class="keyword">class </span><a class="code" href="classvoro_1_1c__loop__order__periodic.html" title="Class for looping over all of the particles specified in a pre-assembled particle_order class...">c_loop_order_periodic</a> : <span class="keyword">public</span> <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a> {
<a name="l00410"></a>00410         <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00411"></a>00411 <span class="comment">                /** A reference to the ordering class to use. */</span>
<a name="l00412"></a><a class="code" href="classvoro_1_1c__loop__order__periodic.html#a73e215fc8915ed65f17e633d85c0f018">00412</a>                 <a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> &amp;<a class="code" href="classvoro_1_1c__loop__order__periodic.html#a73e215fc8915ed65f17e633d85c0f018">vo</a>;<span class="comment"></span>
<a name="l00413"></a>00413 <span class="comment">                /** A pointer to the current position in the ordering class. */</span>
<a name="l00414"></a><a class="code" href="classvoro_1_1c__loop__order__periodic.html#a281ac4b9e4f3c687081f067239fdd982">00414</a>                 <span class="keywordtype">int</span> *<a class="code" href="classvoro_1_1c__loop__order__periodic.html#a281ac4b9e4f3c687081f067239fdd982">cp</a>;<span class="comment"></span>
<a name="l00415"></a>00415 <span class="comment">                /** A pointer to the end position in the ordering class. */</span>
<a name="l00416"></a><a class="code" href="classvoro_1_1c__loop__order__periodic.html#a80063187d6d4ea8e8bb2efe02091a475">00416</a>                 <span class="keywordtype">int</span> *<a class="code" href="classvoro_1_1c__loop__order__periodic.html#a80063187d6d4ea8e8bb2efe02091a475">op</a>;<span class="comment"></span>
<a name="l00417"></a>00417 <span class="comment">                /** The constructor copies several necessary constants from the</span>
<a name="l00418"></a>00418 <span class="comment">                 * base class, and sets up a reference to the ordering class to</span>
<a name="l00419"></a>00419 <span class="comment">                 * use.</span>
<a name="l00420"></a>00420 <span class="comment">                 * \param[in] con the container class to use.</span>
<a name="l00421"></a>00421 <span class="comment">                 * \param[in] vo_ the ordering class to use. */</span>
<a name="l00422"></a>00422                 <span class="keyword">template</span>&lt;<span class="keyword">class</span> c_<span class="keyword">class</span>&gt;
<a name="l00423"></a><a class="code" href="classvoro_1_1c__loop__order__periodic.html#adb9aea9a009c1dfdd231b608257d04f9">00423</a>                 <a class="code" href="classvoro_1_1c__loop__order__periodic.html" title="Class for looping over all of the particles specified in a pre-assembled particle_order class...">c_loop_order_periodic</a>(c_class &amp;con,<a class="code" href="classvoro_1_1particle__order.html" title="A class for storing ordering information when particles are added to a container.">particle_order</a> &amp;vo_)
<a name="l00424"></a>00424                 : <a class="code" href="classvoro_1_1c__loop__base.html" title="Base class for looping over particles in a container.">c_loop_base</a>(con), vo(vo_), nx(con.nx), oxy(con.nx*con.oy) {}<span class="comment"></span>
<a name="l00425"></a>00425 <span class="comment">                /** Sets the class to consider the first particle.</span>
<a name="l00426"></a>00426 <span class="comment">                 * \return True if there is any particle to consider, false</span>
<a name="l00427"></a>00427 <span class="comment">                 * otherwise. */</span>
<a name="l00428"></a><a class="code" href="classvoro_1_1c__loop__order__periodic.html#a3734764b6b10670ce820de143d118d8e">00428</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1c__loop__order__periodic.html#a3734764b6b10670ce820de143d118d8e">start</a>() {
<a name="l00429"></a>00429                         cp=vo.o;op=vo.op;
<a name="l00430"></a>00430                         <span class="keywordflow">if</span>(cp!=op) {
<a name="l00431"></a>00431                                 ijk=*(cp++);decode();
<a name="l00432"></a>00432                                 q=*(cp++);
<a name="l00433"></a>00433                                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00434"></a>00434                         } <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00435"></a>00435                 }<span class="comment"></span>
<a name="l00436"></a>00436 <span class="comment">                /** Finds the next particle to test.</span>
<a name="l00437"></a>00437 <span class="comment">                 * \return True if there is another particle, false if no more</span>
<a name="l00438"></a>00438 <span class="comment">                 * particles are available. */</span>
<a name="l00439"></a><a class="code" href="classvoro_1_1c__loop__order__periodic.html#ae34027247718bedc32b705ceb5b029de">00439</a>                 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1c__loop__order__periodic.html#ae34027247718bedc32b705ceb5b029de">inc</a>() {
<a name="l00440"></a>00440                         <span class="keywordflow">if</span>(cp==op) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00441"></a>00441                         ijk=*(cp++);decode();
<a name="l00442"></a>00442                         q=*(cp++);
<a name="l00443"></a>00443                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00444"></a>00444                 }
<a name="l00445"></a>00445         <span class="keyword">private</span>:<span class="comment"></span>
<a name="l00446"></a>00446 <span class="comment">                /** The number of computational blocks in the x direction. */</span>
<a name="l00447"></a>00447                 <span class="keyword">const</span> <span class="keywordtype">int</span> nx;<span class="comment"></span>
<a name="l00448"></a>00448 <span class="comment">                /** The number of computational blocks in a z-slice. */</span>
<a name="l00449"></a>00449                 <span class="keyword">const</span> <span class="keywordtype">int</span> oxy;<span class="comment"></span>
<a name="l00450"></a>00450 <span class="comment">                /** Takes the current block index and computes indices in the</span>
<a name="l00451"></a>00451 <span class="comment">                 * x, y, and z directions. */</span>
<a name="l00452"></a>00452                 <span class="keyword">inline</span> <span class="keywordtype">void</span> decode() {
<a name="l00453"></a>00453                         k=ijk/oxy;
<a name="l00454"></a>00454                         <span class="keywordtype">int</span> ijkt=ijk-oxy*k;
<a name="l00455"></a>00455                         j=ijkt/nx;
<a name="l00456"></a>00456                         i=ijkt-j*nx;
<a name="l00457"></a>00457                 }
<a name="l00458"></a>00458 };
<a name="l00459"></a>00459 
<a name="l00460"></a>00460 }
<a name="l00461"></a>00461 
<a name="l00462"></a>00462 <span class="preprocessor">#endif</span>
</pre></div></div>
</div>


<hr class="footer"/><address class="footer"><small>
Generated on Fri Sep 23 2011 22:49:06 for Voro++ by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.5.1
</small></address>

</body>
</html>
